/********************************************
 * 功能说明: 
 * 模块名称: 
 * 系统名称: 
 * 软件版权: 西安华信智慧数字科技有限公司
 * 系统版本: 1.0.0
 * 开发人员: zhangfb
 * 开发时间: 2019/9/4 16:19
 * 审核人员: 
 * 相关文档: 
 * 修改记录: 修改日期 修改人员 修改说明
 *********************************************/
package com.hyacinth.cloudnote.common.utils;

import com.hyacinth.cloudnote.common.exception.ServiceException;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

/**
 * 类操作工具
 * @author zhangfb
 * @version 1.0.0.1
 * @since JDK 1.8
 */
@Slf4j
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ClassUtils extends org.apache.commons.lang3.ClassUtils {

    /**
     * 对象类型转换
     * @param original 原对象
     * @param toClass  目标类
     * @return  目标对象
     */
    public static Object converter(Object original, Class<?> toClass) {
        Object target;
        if (toClass.isEnum()) {
            target = getEnumObject(original.toString(), toClass);
        } else if (isAssignable(toClass, Boolean.TYPE)) {
            target = Boolean.valueOf(original.toString()) ;
        } else if (isAssignable(toClass, Double.TYPE)) {
            target = Double.valueOf(original.toString());
        } else if (isAssignable(toClass, Integer.class)) {
            target = Integer.valueOf(original.toString());
        } else if (isAssignable(toClass, Long.class)) {
            target = Long.valueOf(original.toString());
        } else {
            target = original;
        }
        return target;
    }

    /**
     * 将字符串对象转换为枚举值
     * @param value
     * @param clazz
     * @param <T>
     * @return
     */
    private static <T extends Enum<?>> T getEnumObject(String value, Class clazz) {
        try {
            T[] enumConstants = (T[]) clazz.getEnumConstants();
            for (T ec : enumConstants) {
                if (ec.name().equals(value)) {
                    return ec;
                }
            }
            return null;
        } catch (Exception e) {
            log.error("转枚举对象出错，value = {}, class = {}", value, clazz, e);
            throw new ServiceException(2000000001, "转枚举对象出错");
        }
    }
}
